//
//  BWNetworkManager.swift
//  新浪微博
//
//  Created by 冰凌天 on 2017/8/18.
//  Copyright © 2017年 冰凌天. All rights reserved.
//

import UIKit
import AFNetworking

// Swift 的 枚举 支持任意数据类型
enum WBHTTPMethod {
    case GET
    case POST
}

/// 网络管理工具
class BWNetworkManager: AFHTTPSessionManager {
    
    /// 静态区 / 常量 / 闭包 
    /// 在第一次访问时, 执行闭包, 并且将结果保存在shared常量中
    static let shared = BWNetworkManager()
    
    /// 访问令牌, 所有网络请求使用, 登录除外
    var accessToken : String? // = "2.00mROJhD0HhflP7fc3ce02dds3CCKC"
    
    var uid : String? = "3385980814"
    
    /// 用户登录标记
    var userLogin : Bool {
        return accessToken != nil
    }
    
    /// 专门负责拼接 token 的网络请求方法
    func tokenRequest(method : WBHTTPMethod = .GET, URLString : String, parameters : [String : Any]?, completion : @escaping (_ json : Any?, _ isSuccess : Bool) -> ()) {
        
        // 0. 判断 token 是否为 nil, 为 nil 直接返回
        
        guard let token = accessToken else {
            
            // FIXME: 发送通知, 提示用户登录

            print("没有token, 需要登录")
            completion(nil, false)
            return
        }
        
        
        // 1. 判断参数字典是否存在, 如果为nil, 应该新建字典
        var parameters = parameters
        if parameters == nil {
            parameters = [String : Any]()
        }
        
        parameters?["access_token"] = token;
        
        
        // 调用 request 发起真正的网络请求方法
        request(URLString: URLString, parameters: parameters, completion: completion)
    }
    
    // 使用一个函数封装 AFN 的 GET / POST 请求
    
    /// 封装 AFN 的 GET / POST 请求
    ///
    /// - Parameters:
    ///   - method: GET / POST
    ///   - URLString: URLString
    ///   - parameters: 参数字典
    ///   - completion: 完成回调
    func request(method : WBHTTPMethod = .GET, URLString : String, parameters : [String : Any]?, completion : @escaping (_ json : Any?, _ isSuccess : Bool) -> ()) {
        
        // 成功回调
        let success = { (task : URLSessionDataTask, json : Any?) -> () in
            
            completion(json, true)
            
        }
        
        // 失败回调
        let failure = { (task : URLSessionDataTask?, error : Error) -> () in
            
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                
                print("Token 过期了")
                
                // FIXME: 发送通知(本方法不知道被谁调用, 谁接到通知, 谁处理)
                
            }
            
            print("网络请求错误 \(error)")
            completion(nil, false)
        }
        
        if method == .GET {
            get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }else {
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
    }
    
}














